package partTwo;
/* 本类用作继承的入门案例*/
public class ExtendsDemo {
    public static void main(String[] args) {
        //5.创建对象进行测试
        /* 抽象类不可以被创建对象
         * 可以创建多态对象进行测试*/
        // Animal5 a = new Animal5();  // 会报错
        Animal5 a = new Pig2();
        a.eat();  //调用的是父类的普通方法
        a.fly();  //调用的是抽象父类的声明，普通子类的具体实现
        a.fly2();  //调用的是抽象父类的声明，普通子类的具体实现
    }
}
//1.创建父类
/* 1.如果一个类中包含了抽象方法，那么这个类必须被声明成抽象类
 * 抽象类：被abstract关键字修饰的类*/

abstract class Animal5 {
    //2.创建抽象方法
    /* 2.被abstract修饰的方法是抽象方法，并且抽象方法没有方法体*/
    public abstract void fly();

    public abstract void fly2();

    //3.创建抽象类里的普通方法
    /* 3.抽象类里可以有：全普 / 全抽 / 半普 / 半抽 ，方法不做限制*/
    public void eat() {
        System.out.println("吃啥都行");
    }

    public void play() {
        System.out.println("玩啥都行");
    }
}
//4.创建Animal的子类Pig
/* 4.当一个子类继承了一个抽象父类之后，有俩种解决方案：
 * 方案一：变成抽象类，“躺平”，我也不实现，继续抽象
 * 方案二：实现抽象父类中所有的抽象方法，“父债子偿”*/
//4.1 使用方案一
// abstract class Pig extends Animal{  //方案一
//报错：Class 'Pig' must either be declared abstract or implement abstract method 'fly()' in 'Animal'}
//4.2 使用方案二
class  Pig2 extends Animal5 {
    @Override
    public void fly() {
        System.out.println("我爸的债我终于还清了，我家的猪终于飞起来了~");
    }
    @Override
    public void fly2() {
        System.out.println("抽象父类的所有抽象方法都需要实现，子类才能是普通子类");
    }
}